from rest_framework import serializers
from django.contrib.auth import get_user_model
from .models import UserProfile

User = get_user_model()


class UserProfileSerializer(serializers.ModelSerializer):
    """用户详细资料序列化器"""
    
    class Meta:
        model = UserProfile
        fields = [
            'id', 'real_name', 'id_card', 'address',
            'id_card_front_image',
            'driver_license', 'driver_license_image',
            'business_license', 'business_license_image',
            'created_at', 'updated_at'
        ]


class UserSerializer(serializers.ModelSerializer):
    """用户序列化器
    
    用于序列化用户基本信息，包括：
    - 基本身份信息（ID、手机号、微信OpenID）
    - 角色信息和认证状态
    - 企业信息（公司名称、信用评分）
    - JWT令牌信息（访问令牌、刷新令牌）
    - 位置信息（经度、纬度）
    - 时间信息（注册时间、最后登录时间）
    - 详细资料信息（真实姓名、地址）
    
    注意：
    1. 访问令牌和刷新令牌字段为只读，不能通过此序列化器修改。
    2. JWT令牌信息通过登录接口（如短信登录、微信登录）获取并存储在用户表中。
    3. 前端可通过调用 /api/users/{id}/ 接口获取当前用户的JWT令牌信息。
    4. 令牌信息会通过自动刷新机制保持更新。
    5. 经度(longitude)和纬度(latitude)字段用于存储用户最后位置信息。
    """

    real_name = serializers.CharField(source='profile.real_name', read_only=True)
    address = serializers.CharField(source='profile.address', read_only=True)

    class Meta:
        model = User
        fields = [
            'id', 'phone', 'openid', 'role', 'role_authstatus',
            'avatar', 'company', 'credit_score',
            'access_token', 'refresh_token',
            'longitude', 'latitude',  # 新增的位置信息字段
            'date_joined', 'last_login',
            'real_name', 'address'
        ]
        read_only_fields = ['id', 'date_joined', 'last_login', 'access_token', 'refresh_token', 'longitude', 'latitude']


class UserUpdateSerializer(serializers.ModelSerializer):
    """用户更新序列化器
    
    用于更新用户基本信息，包括：
    - 用户角色
    - 角色认证状态（role_authstatus）
    - 头像URL
    - 公司名称
    """

    class Meta:
        model = User
        fields = [
            'role', 'role_authstatus',
            'avatar', 'company'
        ]


class UserProfileUpdateSerializer(serializers.ModelSerializer):
    """用户详细资料更新序列化器"""
    
    class Meta:
        model = UserProfile
        fields = [
            'real_name', 'id_card', 'address',
            'id_card_front_image',
            'driver_license', 'driver_license_image',
            'business_license', 'business_license_image'
        ]


class UserRoleUpdateSerializer(serializers.ModelSerializer):
    """用户角色更新序列化器"""
    
    class Meta:
        model = User
        fields = ['role']
    
    def validate_role(self, value):
        """验证角色值"""
        if value not in dict(User.Role.choices):
            raise serializers.ValidationError("无效的用户角色")
        return value


class UserRoleAuthStatusUpdateSerializer(serializers.ModelSerializer):
    """用户角色认证状态更新序列化器"""
    
    class Meta:
        model = User
        fields = ['role_authstatus']
    
    def validate_role_authstatus(self, value):
        """验证角色认证状态值"""
        if not isinstance(value, bool):
            raise serializers.ValidationError("角色认证状态必须是布尔值")
        return value


class UserLocationUpdateSerializer(serializers.ModelSerializer):
    """用户位置更新序列化器
    
    用于更新用户的位置信息，包括：
    - 经度 (longitude)
    - 纬度 (latitude)
    """

    class Meta:
        model = User
        fields = ['longitude', 'latitude']


class ResetPasswordSerializer(serializers.Serializer):
    """重置密码序列化器"""
    
    phone = serializers.CharField(max_length=11)
    code = serializers.CharField(max_length=6)
    new_password = serializers.CharField(min_length=6)


class BindPhoneSerializer(serializers.Serializer):
    """绑定手机号序列化器"""
    
    phone = serializers.CharField(max_length=11)
    code = serializers.CharField(max_length=6)